package com.br.gpstracker.negocio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.content.Context;

public class Carro {
	private static final String FILE_CARRO_CLASS_CONFIG = "carroClassConfig";
	private static final String STR_EQUAL = "=";
	private static final String STR_HIFEN = "-";
	private static final String STR_ISO_8859_1 = "ISO-8859-1";
	private static final String STR_NEW_LINE = "\n";
	private static final String STR_SEPARADOR = "/=/";

	private Integer id;
	private String nomeCarro;
	private String numeroGSM;
	private String senha;
	private List<NumeroAutorizado> numeroAutorizadoList = new ArrayList<Carro.NumeroAutorizado>();

	public static final class NumeroAutorizado {
		private String numero;
		private Boolean autorizado;

		public NumeroAutorizado(String numero, Boolean autorizado) {
			this.numero = numero;
			this.autorizado = autorizado;
		}

		public NumeroAutorizado(String[] numero) {
			this.numero = numero[0];
			this.autorizado = Boolean.valueOf(numero[1]);
		}

		public Boolean isAutorizado() {
			return autorizado;
		}

		public String getNumero() {
			return numero;
		}
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNomeCarro() {
		return nomeCarro;
	}

	public void setNomeCarro(String nomeCarro) {
		this.nomeCarro = nomeCarro;
	}

	public String getNumeroGSM() {
		return numeroGSM;
	}

	public void setNumeroGSM(String numeroGSM) {
		this.numeroGSM = numeroGSM;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public List<NumeroAutorizado> getNumeroAutorizadoList() {
		return numeroAutorizadoList;
	}

	public void addNumeroAutorizado(NumeroAutorizado numeroAutorizadoList) {
		this.numeroAutorizadoList.add(numeroAutorizadoList);
	}

	public void salvar(Context context) {
		List<Carro> carros = lerGeral(context);

		if (!carros.contains(this)) {
			carros.add(this);
		} else {
			carros.set(carros.indexOf(this), this);
		}

		salvarGeral(carros, context);
	}

	public void remover(Context context) {
		List<Carro> carros = lerGeral(context);

		carros.remove(this);

		salvarGeral(carros, context);
	}

	public static void removerGeral(Context context) {
		salvarGeral(new ArrayList<Carro>(), context);
	}

	public static boolean salvarGeral(List<Carro> carros, Context context) {
		String value = convertToString(carros);
		try {
			FileOutputStream fos = context.openFileOutput(FILE_CARRO_CLASS_CONFIG, Context.MODE_PRIVATE);
			fos.write(value.getBytes());
			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	public static List<Carro> lerGeral(Context context) {
		try {
			byte[] read = new byte[1000];
			FileInputStream fis = context.openFileInput(FILE_CARRO_CLASS_CONFIG);
			fis.read(read);
			fis.close();
			return convertToObject(new String((byte[]) read, STR_ISO_8859_1).toString().trim());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static List<Carro> convertToObject(String value) {
		List<String> objetos = value.isEmpty() ? new ArrayList<String>() : Arrays.asList(value.split(STR_SEPARADOR));
		List<Carro> returned = new ArrayList<Carro>();
		for (String objeto : objetos) {
			String[] valores = objeto.trim().split(STR_NEW_LINE);
			Carro carro = new Carro();
			carro.setId(Integer.parseInt(valores[0]));
			carro.setNomeCarro(valores[1]);
			carro.setNumeroGSM(valores[2]);
			carro.setSenha(valores[3]);
			carro.addNumeroAutorizado(new NumeroAutorizado(valores[4].split(STR_EQUAL)));
			carro.addNumeroAutorizado(new NumeroAutorizado(valores[5].split(STR_EQUAL)));
			carro.addNumeroAutorizado(new NumeroAutorizado(valores[6].split(STR_EQUAL)));
			carro.addNumeroAutorizado(new NumeroAutorizado(valores[7].split(STR_EQUAL)));
			carro.addNumeroAutorizado(new NumeroAutorizado(valores[8].split(STR_EQUAL)));
			returned.add(carro);
		}
		return returned;
	}

	public static String convertToString(List<Carro> carros) {
		StringBuilder sb = new StringBuilder();
		int i = 0;
		for (Carro carro : carros) {
			sb.append(i++ + STR_NEW_LINE);
			sb.append(carro.getNomeCarro() + STR_NEW_LINE);
			sb.append(carro.getNumeroGSM() + STR_NEW_LINE);
			sb.append(carro.getSenha() + STR_NEW_LINE);
			for (NumeroAutorizado numeroAutorizado : carro.getNumeroAutorizadoList()) {
				sb.append(numeroAutorizado.getNumero() + STR_EQUAL + numeroAutorizado.isAutorizado() + STR_NEW_LINE);
			}
			sb.append(STR_SEPARADOR + STR_NEW_LINE);
		}
		return sb.toString().trim();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((nomeCarro == null) ? 0 : nomeCarro.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Carro other = (Carro) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return id + STR_HIFEN + nomeCarro;
	}
}
